__all__ = ['ParkingManagementSystem']
import time


class ParkingManagementSystem():
    """算法实现类：停车场信息管理系统"""
    def __init__(self):
        """对停车信息进行初始化"""

        # 车位编号存放列表
        self.car_stall = []
        self.truck_stall = []
        # 所有停车信息存放列表
        self.total_info = []

        # 读取停车场数据
        try:
            with open(
                    "D:\\2022常用文件\\课程\\Python\\Submit\\课后作业\\06\\附加作业\\parking_data.txt",
                    "r") as file:
                for line in file.readlines():
                    # 将字符串转化为字典，遇到空行时跳过，防止eval()函数转化空行或者空字符时报错
                    try:
                        info_dict = eval(line)
                        self.total_info.append(info_dict)
                        if info_dict["car_type"] == "car":
                            self.car_stall.append(info_dict["p_number"])
                        else:
                            self.truck_stall.append(info_dict["p_number"])
                    except Exception as result:
                        continue
        except Exception as result:
            print("停车信息数据文件不存在！")

    def parking(self, parking_info):
        """入场停车：传入停车信息，在空的车位中增加车辆信息，更新数据文件"""
        # 判断传入停车信息是否为 None
        if parking_info is None:
            return
        else:
            # 传入停车信息，将新的停车信息存入到列表
            self.total_info.append(parking_info)
            # 将数据更新到文件中
            self.save_to_file()

    def show_all_information(self):
        """输出所有停车场信息，按车位使用情况分类，同一分类中按编号升序排序"""
        # 初始化刷新数据
        self.__init__()
        # 对car类型的车辆所在车位编号进行排序
        self.car_stall.sort()
        # 按car类型显示停车信息
        print("")
        # 查询输入格式化
        print(
            "car_type  p_number  car_number  handler   price   entrance_time")
        # 遍历car类型车位编号，按该编号顺序显示停车信息
        for i in self.car_stall:
            for info_dict in self.total_info:
                if info_dict['p_number'] == i:
                    print("  %s       %s        %s     %s       %s     %s" %
                          (info_dict["car_type"], info_dict["p_number"],
                           info_dict["car_number"], info_dict["handler"],
                           info_dict["price"], info_dict["entrance_time"]))
        print("")
        # 对truck类型的车辆所在车位编号进行排序
        self.truck_stall.sort()
        # 按truck类型显示停车信息，查询输入格式化
        print(
            "car_type  p_number  car_number  handler   price   entrance_time")
        # 遍历truck类型车位编号，按该编号顺序显示停车信息
        for i in self.truck_stall:
            for info_dict in self.total_info:
                if info_dict['p_number'] == i:
                    print("  %s     %s      %s     %s       %s     %s" %
                          (info_dict["car_type"], info_dict["p_number"],
                           info_dict["car_number"], info_dict["handler"],
                           info_dict["price"], info_dict["entrance_time"]))

    def query_by_car_number(self):
        """按车牌号查找停车信息"""
        # 接收车牌编号
        car_number = input("请输入车牌号(示例：京A88888)：")
        # 创建列表保存查询结果
        query_results = []
        # 查询输入格式化
        print(
            "car_type  p_number  car_number  handler   price   entrance_time")
        # 遍历总的列表，匹配符合条件的停车信息，并加入到查询结果列表中
        for info_dict in self.total_info:
            if info_dict["car_number"] == car_number:
                self.print_func(info_dict, query_results)
        # 判定是否查询到符合条件的结果，如有返回查询结果列表，如没有打印提示信息并返回 False
        if len(query_results) > 0:
            return query_results
        else:
            print("未找到相关停车信息！")
            return False

    def query_by_car_type(self):
        """按车类型查找停车信息"""
        # 接受车类型
        car_type = input("请输入车类型(car 或 truck)：")
        # 创建列表保存查询结果
        query_results = []
        # 查询输入格式化
        print(
            "car_type  p_number  car_number  handler   price   entrance_time")
        # 遍历总的列表，匹配符合条件的停车信息，并加入到查询结果列表中
        for info_dict in self.total_info:
            if info_dict["car_type"] == car_type:
                self.print_func(info_dict, query_results)
        # 判定是否查询到符合条件的结果，如有返回查询结果列表，如没有打印提示信息并返回 False
        if len(query_results) > 0:
            return query_results
        else:
            print("未找到相关停车信息！")
            return False

    def query_by_date(self):
        """按使用日期查找停车信息"""
        # 接收查询日期
        date = input("请输入查询日期（格式参考：2022-06-06）：")
        # 创建列表保存查询结果
        query_results = []
        # 查询输入格式化
        print(
            "car_type  p_number  car_number  handler   price   entrance_time")
        # 遍历总的列表，匹配符合条件的停车信息，并加入到查询结果列表中
        for info_dict in self.total_info:
            if info_dict["date"] == date:
                self.print_func(info_dict, query_results)
        # 判定是否查询到符合条件的结果，如有返回查询结果列表，如没有打印提示信息并返回 False
        if len(query_results) > 0:
            return query_results
        else:
            print("未找到相关停车信息！")
            return False

    def query_by_handler(self):
        """按经手人查找停车信息"""
        # 接收经手人姓名
        handler = input("请输入经手人姓名：")
        # 创建列表保存查询结果
        query_results = []
        # 查询输入格式化
        print(
            "car_type  p_number  car_number  handler   price   entrance_time")
        # 遍历总的列表，匹配符合条件的停车信息，并加入到查询结果列表中
        for info_dict in self.total_info:
            if info_dict["handler"] == handler:
                self.print_func(info_dict, query_results)
        # 判定是否查询到符合条件的结果，如有返回查询结果列表，如没有打印提示信息并返回 False
        if len(query_results) > 0:
            return query_results
        else:
            print("未找到相关停车信息！")
            return False

    def query_history_results(self):
        """查询停车场历史记录"""
        # 查询输入格式化
        print(
            "id  car_type  p_number  car_number   handler   price    cost     entrance_time            exit_time"
        )
        try:
            # 读取历史记录数据，如有则显示
            with open("history_data.txt", "r") as file:
                for line in file.readlines():
                    # 将字符串转化为字典，遇到空行时跳过，防止eval()函数转化空行或者空字符时报错
                    try:
                        info_dict = eval(line)
                        if info_dict["car_type"] == "car":
                            # 格式化输出
                            print(
                                "%s   %s        %s        %s     %s       %s      %s    %s       %s"
                                %
                                (info_dict["id"], info_dict["car_type"],
                                 info_dict["p_number"],
                                 info_dict["car_number"], info_dict["handler"],
                                 info_dict["price"], info_dict["cost"],
                                 info_dict["entrance_time"],
                                 info_dict["exit_time"]))
                        else:
                            # 格式化输出
                            print(
                                "%s  %s      %s       %s     %s       %s      %s    %s       %s"
                                %
                                (info_dict["id"], info_dict["car_type"],
                                 info_dict["p_number"],
                                 info_dict["car_number"], info_dict["handler"],
                                 info_dict["price"], info_dict["cost"],
                                 info_dict["entrance_time"],
                                 info_dict["exit_time"]))
                    except Exception as result:
                        continue
        except Exception as result:
            print("暂未发现历史记录！")

    def driving_out(self):
        """出场：删除对应车位的车辆信息，更新数据文件"""
        # 接收出场时间
        exit_time = time.strftime("%Y-%m-%d %H:%M:%S", time.localtime())
        # 接收车牌号
        car_number = input("请输入出场车辆车牌号(示例：京A88888)：")
        # 遍历总停车信息列表，找到该条数据并将其移除列表
        for info_dict in self.total_info:
            if info_dict["car_number"] == car_number:
                # 将出场时间更新到该条数据中
                info_dict["exit_time"] = exit_time
                # 对出场车辆计费
                cost = self.charging(info_dict)
                # 将消费金额更新到该条数据中
                info_dict["cost"] = cost
                # 将该车位编号从列表中移除
                if info_dict["car_type"] == "car":
                    self.car_stall.remove(info_dict["p_number"])
                elif info_dict["car_type"] == "truck":
                    self.truck_stall.remove(info_dict["p_number"])
                # 将该条停车信息从总的停车信息列表中删除
                self.total_info.remove(info_dict)
                # 将数据更新到文件中
                self.save_to_file()
                # 将已出场的停车数据保存到文件
                self.save_history_to_file(info_dict)
                print("车辆出场成功！")
                break
        else:
            print("未找到符合要求的车辆，请确认后输入！")

    def charging(self, info_dict):
        """计费: 传入停车信息，按小时计费"""
        # 接收车辆停车信息
        # 将时间由字符串格式转化为数字格式，以秒为单位
        exit_time = time.mktime(
            time.strptime(info_dict["exit_time"], "%Y-%m-%d %H:%M:%S"))
        entrance_time = time.mktime(
            time.strptime(info_dict["entrance_time"], "%Y-%m-%d %H:%M:%S"))
        # 计算停车时间，单位转化为小时
        parking_time = (exit_time - entrance_time) / 3600
        # 计算消费金额
        cost = round(info_dict["price"] * parking_time, 0)
        print("停车时间为：%.2f 小时， 停车费为：%d 元" % (parking_time, cost))
        # 返回停车消费金额
        return cost

    def save_to_file(self):
        """将停车数据保存到文件"""
        # 打开数据文件，保存数据
        with open(
                "D:\\2022常用文件\\课程\\Python\\Submit\\课后作业\\06\\附加作业\\parking_data.txt",
                "w+") as file:
            for info_dict in self.total_info:
                # 将字典转化为字符串保存
                file.write(str(info_dict))
                file.write("\n")

    def save_history_to_file(self, info_dict):
        """将已完成出场停车数据保存到文件"""
        # 打开数据文件，保存数据
        with open("history_data.txt", "a") as file:
            # 将字典转化为字符串保存
            file.write(str(info_dict))
            file.write("\n")

    def save_query_results_to_file(self, query_results):
        """将查询结果保存到指定数据文件"""
        # 接收输入文件名
        file_name = input("请输入要保存数据的文件名(格式：xxx.txt )：")
        with open(file_name, "a") as file:
            # 将数据转化为字符串保存
            file.write(str(query_results))
            file.write("\n")
        print("查询结果保存成功，文件名为：%s" % file_name)

    def print_func(self, info_dict, query_results):
        """格式化打印输出查询结果"""
        if info_dict["car_type"] == "car":
            # print(info_dict)
            print("  %s       %s        %s     %s       %s     %s" %
                  (info_dict["car_type"], info_dict["p_number"],
                   info_dict["car_number"], info_dict["handler"],
                   info_dict["price"], info_dict["entrance_time"]))
            query_results.append(info_dict)
        elif info_dict["car_type"] == "truck":
            print("  %s     %s      %s     %s       %s     %s" %
                  (info_dict["car_type"], info_dict["p_number"],
                   info_dict["car_number"], info_dict["handler"],
                   info_dict["price"], info_dict["entrance_time"]))
            query_results.append(info_dict)